ScalaのOption, Either, Try
Option[T]型
Some[T]もしくはNoneを返す
Option[A]は抽象クラスで、これを継承したSome[T]クラス、Noneオブジェクト
method
isDefined
get
Noneのときは例外を投げる
code:scala
// map系メソッドとmatchの比較
option.foreach(f)
option match {
case Some(v) => f(v)
case None => // 何もしない
}
option.map(f)
option match {
case Some(v) => Some(f(v))
case None => None
}
option.flatMap(f)
option match {
case Some(v) => f(v)
case None => None
}
otpion.getOrElse(defaultValue)
option match {
case Some(v) => v
case None => defaultValue
}
code:scala
// 引数が両方SomeならSomeが返る。片方でもNoneならNoneが返る
def plus(n1: OptionInt, n2: OptionInt): OptionInt = n1.flatMap(i => n2.map(j => i+j))
入れ子になって微妙に見づらいなmrsekut.icon
for..yield式を使ってこんなふうにもかける
code:scala
def plus(n1: OptionInt, n2: OptionInt): OptionInt = for(i <- n1; j <- n2) yield i + j
forの中のi<-n1のところで、モナドから値を取り出している感じ
Either[A, B]型
Left[A, B]もしくはRight[A, B]を返す
Optionのときと同様のmethodに加えて、mergeなどがある
code:scala
either.merge
eiteher match {
case Right(v) => v
case Left(v) => v
}
Try型
Eitherと似ているが失敗時には例外を保持する
非同期処理のtry/catchでは例外を捕捉できない
SuccessもしくはFailureを返す
Optionのときと同じようなmethocを使える
参考